/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved.
 *
 * The information contained herein is property of Nordic Semiconductor ASA.
 * Terms and conditions of usage are described in detail in NORDIC
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 *
 * Licensees are granted free, non-transferable use of the information. NO
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 * the file.
 *
 */

#ifndef NFC_TEXT_REC_H__
#define NFC_TEXT_REC_H__

/**@file
 *
 * @defgroup nfc_text_rec Text records
 * @{
 * @ingroup  nfc_ndef_messages
 *
 * @brief    Generation of NFC NDEF Text record descriptions.
 *
 */

#include "nfc_ndef_record.h"

/**
 * @brief Text record payload descriptor.
 */
typedef struct
{
    enum
    {
        UTF_8 = 0,
        UTF_16 = 1,
    } utf; ///< Type of the Unicode Transformation Format.

    uint8_t const *p_lang_code; ///< Pointer to the IANA language code.
    uint8_t lang_code_len;      ///< Length of the IANA language code.

    uint8_t const *p_data; ///< Pointer to the user text.
    uint32_t data_len;     ///< Length of the user text.
} nfc_text_rec_payload_desc_t;

/**
 * @brief Constructor for an NFC NDEF Text record payload.
 *
 * @param[in]       p_nfc_rec_text_payload_desc Pointer to the Text record description.
 * @param[out]      p_buff                      Pointer to the payload destination.
 *
 * @param[in,out]   p_len                       Size of the available memory to write as input.
 *                                              Size of the generated record payload as output.
 */
ret_code_t nfc_text_rec_payload_constructor(nfc_text_rec_payload_desc_t *p_nfc_rec_text_payload_desc, uint8_t *p_buff, uint32_t *p_len);

/**
 * @brief External reference to the type field of the Text record, defined in the
 * file @c nfc_text_rec.c. It is used in the @ref NFC_NDEF_TEXT_RECORD_DESC_DEF macro.
 */
extern const uint8_t nfc_text_rec_type_field[];

/**
 * @brief Size of the type field of the Text record, defined in the
 * file @c nfc_text_rec.c. It is used in the @ref NFC_NDEF_TEXT_RECORD_DESC_DEF macro.
 */
#define NFC_TEXT_REC_TYPE_LENGTH 1

/**
 *@brief Macro for creating and initializing an NFC NDEF record descriptor for an Text record.
 *
 * This macro creates and initializes a static instance of type @ref nfc_ndef_record_desc_t and
 * a static instance of type @ref nfc_text_rec_payload_desc_t, which together constitute
 * an instance of an Text record.
 *
 * Use the macro @ref NFC_NDEF_TEXT_RECORD_DESC to access the NDEF Text record descriptor instance.
 *
 * @param[in] NAME              Name of the created record descriptor instance.
 * @param[in] UTF               Unicode Transformation Format.
 * @param[in] P_LANG_CODE       Pointer to the IANA language code.
 * @param[in] LANG_CODE_LEN     Length of the IANA language code.
 * @param[in] P_DATA            Pointer to the user text.
 * @param[in] DATA_LEN          Length of the user text.
 */
#define NFC_NDEF_TEXT_RECORD_DESC_DEF(NAME, UTF, P_LANG_CODE, LANG_CODE_LEN, P_DATA, DATA_LEN)                                                                                                         \
    static nfc_text_rec_payload_desc_t NAME##_nfc_text_rec_payload_desc;                                                                                                                               \
    NAME##_nfc_text_rec_payload_desc = (nfc_text_rec_payload_desc_t){                                                                                                                                  \
        .utf = UTF,                                                                                                                                                                                    \
        .p_lang_code = P_LANG_CODE,                                                                                                                                                                    \
        .lang_code_len = LANG_CODE_LEN,                                                                                                                                                                \
        .p_data = P_DATA,                                                                                                                                                                              \
        .data_len = DATA_LEN,                                                                                                                                                                          \
    };                                                                                                                                                                                                 \
    NFC_NDEF_GENERIC_RECORD_DESC_DEF(NAME, TNF_WELL_KNOWN, 0, 0, nfc_text_rec_type_field, NFC_TEXT_REC_TYPE_LENGTH, nfc_text_rec_payload_constructor, &(NAME##_nfc_text_rec_payload_desc))

/**
 * @brief Macro for accessing the NFC NDEF Text record descriptor
 * instance that was created with @ref NFC_NDEF_TEXT_RECORD_DESC_DEF.
 */
#define NFC_NDEF_TEXT_RECORD_DESC(NAME) NFC_NDEF_GENERIC_RECORD_DESC(NAME)

/** @} */
#endif // NFC_TEXT_REC_H__
